package stream01;

import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * 中间操作:
 *  过滤操作:
 *      filter():传入一个Predicate,根据Predicate的条件对流中的元素进行筛选,满足条件的保留,不满足的剔除
 *  排序的操作:
 *      sorted():根据指定的排序规则(Comparator接口,规则类似TreeSet/TreeMap)对元素进行排序
 *  截取操作:
 *      limit():截取流中指定个数的元素
 *  去重操作:
 *      distinct():将Stream流中的重复元素去除(去除需要依赖的元素hashCode和equals方法)
 *  映射操作:将一种数据(类型)映射成另外一种数据(类型)
 *      map:
 *       mapToInt
 *       mapToDouble
 *       mapToLong
 */
public class StreamDemo04 {
    List<Product> products;

    @Before
    public void init() {
        products = Arrays.asList(
                new Product("联想笔记本", 3000),
                new Product("华硕笔记本", 3700),
                new Product("华硕笔记本", 3700),
                new Product("戴尔笔记本", 5100),
                new Product("惠普笔记本", 4300),
                new Product("苹果笔记本", 17000)
        );
    }

    @Test
    public void test01(){
        //1.输出5000元以上的笔记本信息
        products.stream()//先获取Stream流对象
                .filter(Product -> Product.getProductPrice() > 5000)//接着做了一个中间操作:过滤
                .forEach(System.out::println);//最后做了一个终止操作:输出
    }

    @Test
    public void test02(){
        //2.输出最便宜的三台笔记本信息
        //a.先将商品按照价格从小到大排序
        //b.只获取排好序的前三台笔记本
        products.stream()
                //.sorted((p1,p2)-> p1.getProductPrice()- p2.getProductPrice())
                //.sorted(Comparator.comparing(product -> product.getProductPrice()));
                .sorted(Comparator.comparing(Product::getProductPrice))//先将商品价格按照从大到小排序
                .limit(3)//只获取排序好的前三台笔记本
                .forEach(System.out::println);
    }

    @Test
    public void test03(){
        //3.去除重复的商品
        products.stream()
                .distinct()
                .forEach(System.out::println);
    }

    @Test
    public void test04(){
        //4.获取所有笔记本的平均价格
        double avg = products.stream()
                .distinct()//去除重复商品
                //.mapToInt(products-> products.getProductPrice())/将Stream流中的一个个商品对象映射成(转换成)每个商品对应的价格
                .mapToInt(Product::getProductPrice)
                .average()
                .getAsDouble();

        System.out.println(avg);

    }

}
